
声明 模块 "readline" {

    //@@{ 事件组:events }
    导入 * 转为 事件组 来自 "events";

    //@@{ 流:stream }
    导入 * 转为 流 来自 "stream";

    //@@{ 键_:Key }
    接口 键_ {

        //@@{ 序列:sequence }
        序列?: 文字;

        //@@{ 名称:name }
        名称?: 文字;

        //@@{ ctrl键:ctrl }
        ctrl键?: 真假;

        //@@{ meta键:meta }
        meta键?: 真假;

        //@@{ shift键:shift }
        shift键?: 真假;
    }

    //@@{ 接口_:Interface, 事件组:events, 事件发生器_:EventEmitter }
    类别 接口_ 扩展 事件组.事件发生器_ {

        //@@{ 终端:terminal }
        只读 终端: 真假;

        /**
         * NOTE: According to the documentation:
         *
         * > Instances of the `readline.Interface` class are constructed using the
         * > `readline.createInterface()` method.
         *
         * @see https://nodejs.org/dist/latest-v10.x/docs/api/readline.html#readline_class_interface
         */

        //@@{ 可读流_:ReadableStream, 可写流_:WritableStream, 完成_:Completer, 异步完成_:AsyncCompleter }
        保护 构造(输入: NodeJS.可读流_, 输出?: NodeJS.可写流_, 完成?: 完成_ | 异步完成_, 终端?: 真假);
        /**
         * NOTE: According to the documentation:
         *
         * > Instances of the `readline.Interface` class are constructed using the
         * > `readline.createInterface()` method.
         *
         * @see https://nodejs.org/dist/latest-v10.x/docs/api/readline.html#readline_class_interface
         */

        //@@{ 读行选项_:ReadLineOptions }
        保护 构造(选项组: 读行选项_);

        //@@{ 设置提示:setPrompt }
        设置提示(提示: 文字): 无值;

        //@@{ 提示:prompt }
        提示(保护指针?: 真假): 无值;

        //@@{ 问题:question }
        问题(查询: 文字, 回调: (回答: 文字) => 无值): 无值;

        //@@{ 暂停:pause }
        暂停(): 本体;

        //@@{ 恢复:resume }
        恢复(): 本体;

        //@@{ 关闭:close }
        关闭(): 无值;

        //@@{ 写:write, 缓冲区_:Buffer, 键_:Key }
        写(数据: 文字 | 缓冲区_, 键?: 键_): 无值;

        /**
         * events.EventEmitter
         * 1. close
         * 2. line
         * 3. pause
         * 4. resume
         * 5. SIGCONT
         * 6. SIGINT
         * 7. SIGTSTP
         */

        //@@{ 添加监听器:addListener }
        添加监听器(事件: 文字, 监听器: (...参数组: 任意[]) => 无值): 本体;

        //@@{ 添加监听器:addListener, "关闭":"close" }
        添加监听器(事件: "关闭", 监听器: () => 无值): 本体;

        //@@{ 添加监听器:addListener, "行":"line" }
        添加监听器(事件: "行", 监听器: (输入: 文字) => 无值): 本体;

        //@@{ 添加监听器:addListener, "暂停":"pause" }
        添加监听器(事件: "暂停", 监听器: () => 无值): 本体;

        //@@{ 添加监听器:addListener, "恢复":"resume" }
        添加监听器(事件: "恢复", 监听器: () => 无值): 本体;

        //@@{ 添加监听器:addListener, "__信号_继续信号__":"SIGCONT" }
        添加监听器(事件: "__信号_继续信号__", 监听器: () => 无值): 本体;

        //@@{ 添加监听器:addListener, "__信号_键盘中断__":"SIGINT" }
        添加监听器(事件: "__信号_键盘中断__", 监听器: () => 无值): 本体;

        //@@{ 添加监听器:addListener, "__信号_终端输入停止__":"SIGTSTP" }
        添加监听器(事件: "__信号_终端输入停止__", 监听器: () => 无值): 本体;

        //@@{ 发出:emit }
        发出(事件: 文字 | 符号, ...参数组: 任意[]): 真假;

        //@@{ 发出:emit, "关闭":"close" }
        发出(事件: "关闭"): 真假;

        //@@{ 发出:emit, "行":"line" }
        发出(事件: "行", 输入: 文字): 真假;

        //@@{ 发出:emit, "暂停":"pause" }
        发出(事件: "暂停"): 真假;

        //@@{ 发出:emit, "恢复":"resume" }
        发出(事件: "恢复"): 真假;

        //@@{ 发出:emit, "__信号_继续信号__":"SIGCONT" }
        发出(事件: "__信号_继续信号__"): 真假;

        //@@{ 发出:emit, "__信号_键盘中断__":"SIGINT" }
        发出(事件: "__信号_键盘中断__"): 真假;

        //@@{ 发出:emit, "__信号_终端输入停止__":"SIGTSTP" }
        发出(事件: "__信号_终端输入停止__"): 真假;

        //@@{ 正在:on }
        正在(事件: 文字, 监听器: (...参数组: 任意[]) => 无值): 本体;

        //@@{ 正在:on, "关闭":"close" }
        正在(事件: "关闭", 监听器: () => 无值): 本体;

        //@@{ 正在:on, "行":"line" }
        正在(事件: "行", 监听器: (输入: 文字) => 无值): 本体;

        //@@{ 正在:on, "暂停":"pause" }
        正在(事件: "暂停", 监听器: () => 无值): 本体;

        //@@{ 正在:on, "恢复":"resume" }
        正在(事件: "恢复", 监听器: () => 无值): 本体;

        //@@{ 正在:on, "__信号_继续信号__":"SIGCONT" }
        正在(事件: "__信号_继续信号__", 监听器: () => 无值): 本体;

        //@@{ 正在:on, "__信号_键盘中断__":"SIGINT" }
        正在(事件: "__信号_键盘中断__", 监听器: () => 无值): 本体;

        //@@{ 正在:on, "__信号_终端输入停止__":"SIGTSTP" }
        正在(事件: "__信号_终端输入停止__", 监听器: () => 无值): 本体;

        //@@{ 一次:once }
        一次(事件: 文字, 监听器: (...参数组: 任意[]) => 无值): 本体;

        //@@{ 一次:once, "关闭":"close" }
        一次(事件: "关闭", 监听器: () => 无值): 本体;

        //@@{ 一次:once, "行":"line" }
        一次(事件: "行", 监听器: (输入: 文字) => 无值): 本体;

        //@@{ 一次:once, "暂停":"pause" }
        一次(事件: "暂停", 监听器: () => 无值): 本体;

        //@@{ 一次:once, "恢复":"resume" }
        一次(事件: "恢复", 监听器: () => 无值): 本体;

        //@@{ 一次:once, "__信号_继续信号__":"SIGCONT" }
        一次(事件: "__信号_继续信号__", 监听器: () => 无值): 本体;

        //@@{ 一次:once, "__信号_键盘中断__":"SIGINT" }
        一次(事件: "__信号_键盘中断__", 监听器: () => 无值): 本体;

        //@@{ 一次:once, "__信号_终端输入停止__":"SIGTSTP" }
        一次(事件: "__信号_终端输入停止__", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener }
        预处理监听器(事件: 文字, 监听器: (...参数组: 任意[]) => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "关闭":"close" }
        预处理监听器(事件: "关闭", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "行":"line" }
        预处理监听器(事件: "行", 监听器: (输入: 文字) => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "暂停":"pause" }
        预处理监听器(事件: "暂停", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "恢复":"resume" }
        预处理监听器(事件: "恢复", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "__信号_继续信号__":"SIGCONT" }
        预处理监听器(事件: "__信号_继续信号__", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "__信号_键盘中断__":"SIGINT" }
        预处理监听器(事件: "__信号_键盘中断__", 监听器: () => 无值): 本体;

        //@@{ 预处理监听器:prependListener, "__信号_终端输入停止__":"SIGTSTP" }
        预处理监听器(事件: "__信号_终端输入停止__", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener }
        预处理一次监听器(事件: 文字, 监听器: (...参数组: 任意[]) => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "关闭":"close" }
        预处理一次监听器(事件: "关闭", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "行":"line" }
        预处理一次监听器(事件: "行", 监听器: (输入: 文字) => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "暂停":"pause" }
        预处理一次监听器(事件: "暂停", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "恢复":"resume" }
        预处理一次监听器(事件: "恢复", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "__信号_继续信号__":"SIGCONT" }
        预处理一次监听器(事件: "__信号_继续信号__", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "__信号_键盘中断__":"SIGINT" }
        预处理一次监听器(事件: "__信号_键盘中断__", 监听器: () => 无值): 本体;

        //@@{ 预处理一次监听器:prependOnceListener, "__信号_终端输入停止__":"SIGTSTP" }
        预处理一次监听器(事件: "__信号_终端输入停止__", 监听器: () => 无值): 本体;

        //@@{ 符号_:Symbol, 异步迭代器:asyncIterator, 异步可迭代迭代器_:AsyncIterableIterator }
        [符号_.异步迭代器](): 异步可迭代迭代器_<文字>;
    }

    //@@{ 读行_:ReadLine, 接口_:Interface }
    类型 读行_ = 接口_; // type forwarded for backwards compatiblity

    //@@{ 完成_:Completer, 完成结果_:CompleterResult }
    类型 完成_ = (行: 文字) => 完成结果_;

    //@@{ 异步完成_:AsyncCompleter, 错误_:Error, 完成结果_:CompleterResult }
    类型 异步完成_ = (行: 文字, 回调: (错?: 空值 | 错误_, 结果?: 完成结果_) => 无值) => 任意;

    //@@{ 完成结果_:CompleterResult }
    类型 完成结果_ = [文字[], 文字];

    //@@{ 读行选项_:ReadLineOptions }
    接口 读行选项_ {

        //@@{ 输入:input, 可读流_:ReadableStream }
        输入: NodeJS.可读流_;

        //@@{ 输出:output, 可写流_:WritableStream }
        输出?: NodeJS.可写流_;

        //@@{ 完成:completer, 完成_:Completer, 异步完成_:AsyncCompleter }
        完成?: 完成_ | 异步完成_;

        //@@{ 终端:terminal }
        终端?: 真假;

        //@@{ 历史大小:historySize }
        历史大小?: 数字;

        //@@{ 提示:prompt }
        提示?: 文字;

        //@@{ crlf延迟:crlfDelay }
        crlf延迟?: 数字;

        //@@{ 删除历史记录重复项:removeHistoryDuplicates }
        删除历史记录重复项?: 真假;
    }

    //@@{ 创建接口:createInterface, 可读流_:ReadableStream, 可写流_:WritableStream, 完成_:Completer }
    //@@{ 异步完成_:AsyncCompleter, 接口_:Interface }
    函数 创建接口(输入: NodeJS.可读流_, 输出?: NodeJS.可写流_, 完成?: 完成_ | 异步完成_, 终端?: 真假): 接口_;

    //@@{ 创建接口:createInterface, 读行选项_:ReadLineOptions, 接口_:Interface }
    函数 创建接口(选项组: 读行选项_): 接口_;

    //@@{ 光标到:cursorTo, 可写流_:WritableStream }
    函数 光标到(流: NodeJS.可写流_, x: 数字, y?: 数字): 无值;

    //@@{ 发出按键事件:emitKeypressEvents, 可读流_:ReadableStream, 接口_:Interface }
    函数 发出按键事件(流: NodeJS.可读流_, 接口?: 接口_): 无值;

    //@@{ 移动光标:moveCursor, 可写流_:WritableStream }
    函数 移动光标(流: NodeJS.可写流_, dx: 数字 | 文字, dy: 数字 | 文字): 无值;

    //@@{ 清除行:clearLine, 可写流_:WritableStream }
    函数 清除行(流: NodeJS.可写流_, 目录: 数字): 无值;

    //@@{ 清除光标以下屏幕:clearScreenDown, 可写流_:WritableStream }
    函数 清除光标以下屏幕(流: NodeJS.可写流_): 无值;
}
